import { getToken, homeUrl } from './const.ts';
import { message, Modal, } from 'antd';

interface RequestOptions extends RequestInit {
  data?: any; // For request body
}

export async function request (
  url: string,
  options: RequestOptions = {}
) {
  const token = getToken();

  // 如果没有 token，跳转到登录页
  if (!token) {
    console.warn('No token found, redirecting to login page.');
    // 这里使用 window.location.href 是最直接的非 React Router Hook 的跳转方式
    window.location.href = '/login';
    // 抛出错误或返回一个不会解决的Promise，阻止后续执行
    return Promise.reject(new Error('Authentication required.'));
  }

  const defaultHeaders = {
    'Content-Type': 'application/json',
    token, // 添加 token
  };

  const config: RequestInit = {
    ...options,
    headers: {
      ...defaultHeaders,
      ...options.headers, // 允许覆盖或添加其他头
    },
  };

  // 处理请求体
  if (options.data && (config.method === 'POST' || config.method === 'PUT')) {
    config.body = JSON.stringify(options.data);
  }

  try {
    const response = await fetch(url, config);

    // 检查响应状态
    if (!response.ok) {
      // 如果是 401 Unauthorized，也跳转到登录页
      if (response.status === 401) {
        console.error('Unauthorized request, redirecting to login page.');
        window.location.href = '/login';
        return Promise.reject(new Error('Unauthorized.'));
      }
      const errorData = await response.json();
      return Promise.reject(new Error(errorData.msg || 'Request failed'));
    }

    // 尝试解析JSON
    const data = await response.json();
    
    if (data?.code === 200) {
      // 接口请求成功
      return data;
    } else if (data?.code === 399) {
      // 登录失效
      window.location.href = '/login';
      return Promise.reject(new Error('登录失效'));
    } else if (data?.code === 203) {
      // 无权限操作
      Modal.error({
        title: '提示',
        content: data?.msg || '无权限操作！',
        onOk: () => {
          window.location.href = homeUrl;
        }
      });
    } else {
      // 使用antd的message.error显示错误信息
      message.error(data?.msg || '请求失败');
      return Promise.reject(data?.msg || '请求失败');
    }
    
  } catch (error) {
    console.error('Request error:', error);
    // 使用antd的message.error显示错误信息
    message.error('网络请求失败，请检查网络连接');
    return Promise.reject(error);
  }
}
